package br.com.linkcom.sined.util.neo.persistence;

import java.util.List;

import br.com.linkcom.neo.controller.crud.FiltroListagem;
import br.com.linkcom.neo.persistence.ListagemResult;
import br.com.linkcom.neo.persistence.QueryBuilder;

public class ListagemResultSined<E> extends ListagemResult<E>{

	public ListagemResultSined(QueryBuilder<E> queryBuilder, FiltroListagem filtroListagem) {
		super(queryBuilder, filtroListagem);
	}
	
	@Override
	@SuppressWarnings("unchecked")
	protected void init(QueryBuilder<E> queryBuilder, FiltroListagem filtroListagem, Boolean forceCountAllFields) {		
		QueryBuilderSined<Long> countQueryBuilder = new QueryBuilderSined<Long>(queryBuilder.getHibernateTemplate());
		       
        if(forceCountAllFields != null && forceCountAllFields){
        	countQueryBuilder.select("count(*)");
        } else {
        	String idPropertyName = queryBuilder.getHibernateTemplate().getSessionFactory().getClassMetadata(queryBuilder.getFrom().getFromClass()).getIdentifierPropertyName();
        	countQueryBuilder.select("count(distinct "+queryBuilder.getAlias()+"."+idPropertyName+")");
        }
        
		
        QueryBuilder.From from = queryBuilder.getFrom();
        countQueryBuilder.from(from);
        
        List<QueryBuilder<E>.Join> joins = queryBuilder.getJoins();
        for (QueryBuilder.Join join : joins) {
        	//quando estiver contando nao precisa de fazer fetch do join
			countQueryBuilder.join(join.getJoinMode(), false, join.getPath());
		}
        QueryBuilder.Where where = queryBuilder.getWhere();
		countQueryBuilder.where(where);
		countQueryBuilder.setUseTranslator(false);
		Long numeroResultados = countQueryBuilder.unique();
                
		filtroListagem.setNumberOfResults(numeroResultados.intValue());
		init(queryBuilder, filtroListagem, numeroResultados);
	}

}
